package com.zhaiweijia.util;
/**
 * 字符串工具类
 * @author hanzidong
 * @version v1.0
 */
public class StringUtil {
	
	//邮箱正则表达式
	private static String EMAIL_REG = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
	//手机号正则表达式
	private static String PHONE_REG = "^1[3|5|6|7|8|9]\\d{9}$";
	//字符串正则表达式
	private static String LETTER_REG = "^[a-zA-Z]+$";
	
	/**
	* 功能：检查包含空白字符在内的字符系列长度
	* 示例：
	* StringUtil.hasLength(null) -> false
	* StringUtil.hasLength("") -> false
	* StringUtil.hasLength(" ") -> true
	* StringUtil.hasLength("Hello") -> true
	*/
	public static boolean hasLength(String src){
		return (src != null && !"".equals(src));
	}
	
	/**
	* 功能：检查包含空白字符在内的字符系列长度，并处理过滤前后空格
	* 示例：
	* StringUtil.hasText(null) -> false
	* StringUtil.hasText("") -> false
	* StringUtil.hasText(" ") -> false
	* StringUtil.hasText("Hello") -> true
	*/
	public static boolean hasText(String src){
		return (src != null && !"".equals(src.trim()));
	}
	
	
	/**
	* 功能：验证是否为合格邮箱
	* 示例：
	* StringUtil.isEmail(null) -> false
	* StringUtil.isEmail("") -> false
	* StringUtil.isEmail("zhangjihao@") -> false
	* StringUtil.isEmail("zhangjihao@sohu") -> false
	* StringUtil.isEmail("zhangjihao@sohu.com") -> true
	*/
	public static boolean isEmail(String email){
		return hasText(email) && email.matches(EMAIL_REG);
	}
	
	/**
	* 功能：验证是否为合格手机号
	* 示例：
	* StringUtil.isPhone(null) -> false
	* StringUtil.isPhone("") -> false
	* StringUtil.isPhone("14312039428") -> false
	* StringUtil.isPhone("13900139000") -> true
	*/
	public static boolean isPhone(String src){
		return hasText(src) && src.matches(PHONE_REG);
	}
	
	/**
	* 功能：判断是否全部为字母
	* 示例：
	* StringUtil.isLetter(null) -> false
	* StringUtil.isLetter("") -> false
	* StringUtil.isLetter(".com") -> false
	* StringUtil.isLetter("howSun") -> true
	*/
	public static boolean isLetter(String src){
		return hasText(src) && src.matches(LETTER_REG);
	}
	
	/**
	* 功能：反转字符串
	* 示例："abcd" → "dcba"
	*
	* 参数1：src，源字符串
	* 返回值：反转的字符串
	*/
	public static String reverse(String src){
		//通过StringBuffer进行转换
		StringBuffer sb = new StringBuffer(src);
		
		return sb.reverse().toString();
	}
	
	/**
	* 功能：隐藏字符串
	* 示例：StringUtil.hidden("13856237928", 3,7) -> "138****7928"
	* 参数1：src，源字符串
	* 参数2：start，从开始的位置隐藏，如果为空，则全部不隐藏，
	* 参数3：end，结束位置，如果为空或为-1，则直到末尾都隐藏，如果超过源字符串长度，则只到末尾
	* 返回值：隐藏结果
	*/
	public static String hidden(String src, Integer start, Integer end){
		
		if(src != null && start != null) {
			//进行隐藏，将前面字符串和后面字符串进行截取，将中间字符串换成*，然后进行拼接
			
			//开始下标之前的字符串
			String start_src = src.substring(0, start);
			
			//结束下标之后的字符串，如果为空或为-1，则直到末尾都隐藏，如果超过源字符串长度，则只到末尾
			if(end == null || end < 0 || end > src.length()) {
				end = src.length();
			}
			String end_src = src.substring(end, src.length());
			
			//中间部分
			String center_src = "";
			
			//中间部分进行替换
			for(int i = start; i < end ;i++ ) {
				center_src += "*";
			}
			
			//拼接字符串
			return start_src + center_src + end_src;
			
		}else {
			//如果开始位置为空，则直接返回原字符串
			return src;
		}
	}
}
